# auth.py
from passlib.context import CryptContext
from datetime import datetime, timedelta, timezone
from jose import JWTError, jwt
from fastapi import Depends, HTTPException, status


# 配置
SECRET_KEY = "8848"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30



pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")



def hash_password(password: str) -> str:
    return pwd_context.hash(password)

def verify_password(plain_password: str, hashed: str) -> bool:
    return pwd_context.verify(plain_password, hashed)

def create_access_token(data: dict):
    to_encode = data.copy()
    expire = datetime.now(timezone.utc) + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

def decode_access_token(token: str) -> dict | None:
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        return payload
    except JWTError:
        return None   
    
    """
    你现在可以这样理解整个流程：

用户注册 → 密码被 hash_password 加密 → 存进数据库
用户登录 → 用 verify_password 校验 → 正确就 create_access_token
用户访问 /me → 用 decode_access_token 解析 Token → 拿到用户名 → 返回信息
    """
    
    
# 用户注册：
#    用户输入密码 "123456"
#          ↓
#    hash_password("123456") → "$2b$12$AidZ..."
#          ↓
#    把加密后的密码存进数据库

# 用户登录：
#    用户输入密码 "123456"
#          ↓
#    从数据库取出加密密码 "$2b$12$AidZ..."
#          ↓
#    verify_password("123456", "$2b$12$AidZ...") → True
#          ↓
#    create_access_token({"sub": "alice"}) → 生成 Token
#          ↓
#    返回给前端：{"access_token": "eyJ...", "token_type": "bearer"}

# 访问个人页面：
#    前端带上 Token：Authorization: Bearer eyJ...
#          ↓
#    decode_access_token("eyJ...") → {"sub": "alice", "exp": 123456}
#          ↓
#    如果成功 → 允许访问；失败 → 返回 401 错误